package moduloIndexacion.gestores;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;

import mapeo.MapDocumento;
import mapeo.MapExtension;
import entidades.Documento;
import entidades.Posteo;
import entidades.Extension;
import entidades.Vocabulario;

public class GestorIndexacion {
	
	private GestorVocabulario g_voc;    			 // PARA OBTENER LOS POSTEOS
	private GestorDocumento g_doc;                   // PARA REALIZAR OPERACIONES CON LOS DOCUMENTOS QUE RECIBA
	private boolean activarStopWords;   			 // PARA ACTIVAR/DESACTIVAR EL USO DE STOPWORDS
	private Extension[] extensionesSelecc;           // PARA CONOCER QUE EXTENSIONES DE DOCUMENTO PROCESAR
	private ArrayList<File> files;					 // ARCHIVOS CON LOS CUALES SE VA A TRABAJAR
	
	public GestorIndexacion(){
		g_voc = new GestorVocabulario();
		g_doc = new GestorDocumento();
		activarStopWords = false;
		files = new ArrayList<File>(); 
	}
	
	// Gets y Sets del array de Extensiones con las cuales van a trabajar el Sistema.
	public Extension[] getExtensionesSelecc() {
		return extensionesSelecc;
	}

	public void setExtensionesSelecc(Extension[] extensionesSelecc) {
		this.extensionesSelecc = null;
		this.extensionesSelecc = extensionesSelecc;
	}

	// Gets y Sets de la lista de archivos que se va a procesar en el motor de busqueda
	public ArrayList<File> getFiles() {
		return files;
	}

	public void setFiles(ArrayList<File> files) {
		this.files = files;
	}

	/**
	 * Metodo que devuelve las extensiones con las que trabaja el sistema.
	 * @return una lista de extensiones con las que trabaja el sistema.
	 */
	public ArrayList<Extension> extensionesSistema(){
		return g_voc.obtenerExtensionesSistema();
	}

	/**
	 * Metodo que guarda todos los documentos seleccionados, sus posteos y el vocabulario que utiliza en la BD
	 */
	public void savePosteo(){
		java.util.Iterator<File> it = files.iterator();
		while (it.hasNext()){
			File file  = it.next();
			Documento docSave = g_doc.saveDocumento(file);
			if( docSave != null ){
				if(g_voc.obtenerVocabulario(activarStopWords, docSave)){
					if(g_voc.saveVocabulario()){
						if(g_voc.savePosteo()){
							System.out.println("Se pudo grabar el Documento: " + file.getAbsolutePath());
						}
					}
				}
				
			}else{
				System.out.println("No se pudo grabar el Documento: " + file.getAbsolutePath());
			}
		}
	}
	
	/**
	 * Recorre todos los archivos que posee la BD y observa si existe alguno que ya no exista, y lo elimina del sistema
	 */
	public void consistirBaseDatos(){
		ArrayList<Documento> docInconsistentes = g_doc.consistirBaseDatosDocumentos();
		Iterator<Documento> itDoc = docInconsistentes.iterator();
		while( itDoc.hasNext() ){
			Documento docAux = itDoc.next();
			ArrayList<Posteo> posteoAsociado = g_voc.obtenerPosteoXDoc( docAux );
			Iterator<Posteo> itPosteo = posteoAsociado.iterator();
			while( itPosteo.hasNext() ){
				Posteo postAux = itPosteo.next();
				Vocabulario vocAux =g_voc.obtenerVocabularioXPosteo( postAux );
				int nr = vocAux.getNr() ;
				if(nr == 1){	
					if(g_voc.elimnarPosteo( postAux ) ){
						g_voc.eliminarVoc(vocAux);
						}
				}else{
					vocAux.setNr(vocAux.getNr()-1);
					if(vocAux.getMax_tf() == postAux.getTerm_frecuency()){
						postAux.setTerm_frecuency(-1);
						g_voc.updatePosteo(postAux);
						vocAux.setMax_tf( g_voc.getMaxTf(vocAux) );
						g_voc.updateVocabulario(vocAux);
					}
					g_voc.elimnarPosteo( postAux);
				}
			}
			g_doc.eliminarDoc( docAux );
		}
	}

	/**
	 * Metodo que elimina todos los registros de la Bd
	 * @return true en caso afirmativo, false en caso contrario.
	 */
	public boolean eliminarBD() {
		boolean flagGestorV = g_voc.deleteAll();
		boolean flagGestorD = g_doc.deleteAll();
		if(flagGestorD && flagGestorV){
			return true;
		}
		return false;
	}
}
